/*			Programa MT_1.C				*/
/*								*/
/*      Compilar i executar:					*/
/*      	$ cc mt_1.c -lpthread -o mt_1			*/
/*      	$ mt_1 num_threads n_vegades max_segons		*/
/*      Executa tants threads com indica el primer parametre,   */
/*      i cada thread visualitza un caracter identificatiu      */
/*	(thread 0 -> 'a', thread 1 -> 'b', ...) tantes vegades  */
/*	com indiqui el segon parametre */

#define _REENTRANT
#include <pthread.h>
#include <stdio.h>

#define MAX_THREADS	10
#define MAX_VEGADES	100

pthread_t tid[MAX_THREADS];      /* taula d'identificadors dels threads */
pthread_t cid[MAX_THREADS];      /* taula d'identificadors dels threads */

/* imprimir una marca corresponent al num. de thread ('a'+pthread_self()) */
/* les vegades que indiqui el parametre (n_v) */
void * caracter(void *n_v)
{
    int i,j;

    for (i=0; i < (int) n_v; i++)
    {
	for(j=0;j<10000000;j++);		      
	printf("%c",'a'+pthread_self());	/* imprimir marca del thread */
    }
    return((void *)i);	/* retorna el nombre de caracters escrits */
}


int main(int n_args, char * ll_args[])
{
    int i,j,n,n_thr,n_veg,t;
    pthread_attr_t attr;

    if (n_args < 3)
    {	fprintf(stderr,"\tus : mt_11 num_threads n_vegades\n");
	exit(1);
    }
    n_thr = atoi(ll_args[1]);		/* convertir parametres a enter */
    n_veg = atoi(ll_args[2]);
    if (n_thr < 1) n_thr = 1;		/* i filtrar el seu valor */
    if (n_thr > MAX_THREADS) n_thr = MAX_THREADS;
    if (n_veg < 1) n_veg = 1;
    if (n_veg > MAX_VEGADES) n_veg = MAX_VEGADES;

    setbuf(stdout,NULL);		/* anular buffer de sortida estandard */
    printf("Main thread [%d] del proces (%d) : ", pthread_self(),getpid());
    n = 0;
	
	pthread_attr_init(&attr);
	pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);
	pthread_attr_setschedpolicy(&attr,SCHED_RR);
	attr.param.sched_priority=8;

    for ( i = 0; i < n_thr; i++)
    {
	if (pthread_create(&tid[i], &attr, caracter, (void *)n_veg) == 0)
	    cid[n++]=tid[i];
    }
    for (i=0; i < n_veg; i++)
    {
		for (j=0;j<5000000;j++);
		printf("p");	/* imprimir marca del pare */
	}

	for ( i = 0; i < n_thr; i++)
	{   pthread_join(cid[i], (void **)&t);
	    printf("\nel thread (%d) ha retornat %d\n",tid[i],t);
	}
	
    return(0);
} 

